From: Yang Qian Date: Mon, 8 Oct 2018 03:10:14 +0000 (+0800) Subject: tools/ocaml: Release the global lock before invoking block syscalls X-Git-Tag: archive/raspbian/4.14.0+80-gd101b417b7-1+rpi1^2~63^2~3173 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https://%22%22/%22http:/www.example.com/cgi/%22https:/%22%22?a=commitdiff_plain;h=7b20a865bc105fe566156201c8e6c37ef692e3dd;p=xen.git tools/ocaml: Release the global lock before invoking block syscalls Functions related with event channel are parallelizable, so release global lock before invoking C function which will finally call block syscalls. Signed-off-by: Yang Qian Acked-by: Christian Lindig Reviewed-by: Andrew Cooper --- diff --git a/tools/ocaml/libs/eventchn/xeneventchn_stubs.c b/tools/ocaml/libs/eventchn/xeneventchn_stubs.c index 2b7984fb0d..ba40078d09 100644 --- a/tools/ocaml/libs/eventchn/xeneventchn_stubs.c +++ b/tools/ocaml/libs/eventchn/xeneventchn_stubs.c @@ -32,6 +32,7 @@ #include #include #include +#include #define _H(__h) ((xenevtchn_handle *)(__h)) @@ -39,8 +40,12 @@ CAMLprim value stub_eventchn_init(void) { CAMLparam0(); CAMLlocal1(result); + xenevtchn_handle *xce; + + caml_enter_blocking_section(); + xce = xenevtchn_open(NULL, 0); + caml_leave_blocking_section(); - xenevtchn_handle *xce = xenevtchn_open(NULL, 0); if (xce == NULL) caml_failwith("open failed"); @@ -68,7 +73,10 @@ CAMLprim value stub_eventchn_notify(value xce, value port) CAMLparam2(xce, port); int rc; + caml_enter_blocking_section(); rc = xenevtchn_notify(_H(xce), Int_val(port)); + caml_leave_blocking_section(); + if (rc == -1) caml_failwith("evtchn notify failed"); @@ -82,7 +90,10 @@ CAMLprim value stub_eventchn_bind_interdomain(value xce, value domid, CAMLlocal1(port); xenevtchn_port_or_error_t rc; + caml_enter_blocking_section(); rc = xenevtchn_bind_interdomain(_H(xce), Int_val(domid), Int_val(remote_port)); + caml_leave_blocking_section(); + if (rc == -1) caml_failwith("evtchn bind_interdomain failed"); port = Val_int(rc); @@ -96,7 +107,10 @@ CAMLprim value stub_eventchn_bind_virq(value xce, value virq_type) CAMLlocal1(port); xenevtchn_port_or_error_t rc; + caml_enter_blocking_section(); rc = xenevtchn_bind_virq(_H(xce), Int_val(virq_type)); + caml_leave_blocking_section(); + if (rc == -1) caml_failwith("evtchn bind_virq failed"); port = Val_int(rc); @@ -109,7 +123,10 @@ CAMLprim value stub_eventchn_unbind(value xce, value port) CAMLparam2(xce, port); int rc; + caml_enter_blocking_section(); rc = xenevtchn_unbind(_H(xce), Int_val(port)); + caml_leave_blocking_section(); + if (rc == -1) caml_failwith("evtchn unbind failed"); @@ -122,7 +139,10 @@ CAMLprim value stub_eventchn_pending(value xce) CAMLlocal1(result); xenevtchn_port_or_error_t port; + caml_enter_blocking_section(); port = xenevtchn_pending(_H(xce)); + caml_leave_blocking_section(); + if (port == -1) caml_failwith("evtchn pending failed"); result = Val_int(port); @@ -134,9 +154,15 @@ CAMLprim value stub_eventchn_unmask(value xce, value _port) { CAMLparam2(xce, _port); evtchn_port_t port; + int rc; port = Int_val(_port); - if (xenevtchn_unmask(_H(xce), port)) + + caml_enter_blocking_section(); + rc = xenevtchn_unmask(_H(xce), port); + caml_leave_blocking_section(); + + if (rc) caml_failwith("evtchn unmask failed"); CAMLreturn(Val_unit); }